Toolbar beeinflussen
Mit dem folgenden Beispielprogramm wollen wir zeigen, wie Sie eigene Knöpfe in die ALV-Grid-Toolbar einbauen können. Allerdings wollen wir es nicht bei einem Knopf belassen, sondern wollen hier den Zustand “gedrückt” oder “nicht gedrückt” verwalten.
Beschreibung
Das Programm erzeugt ein einfaches ALV-Grid mit den ersten zwanzig Einträgen der Ländertabelle. Dabei erzeugen wir einen eigenen “normalen” Druckknopf.
Nachdem der Anwender diesen Druckknopf betätigt hat, wird das Ereignis SET_TOOLBAR_INTERACTIVE aufgerufen und die Toolbar wird erneut aufgebaut. Diesmal bekommt der Knopf jedoch den Zustand “gedrückt”.
Unser eigener Druckknopf im Originalzustand |
Der gleiche Druckknopf, nachdem er einmal gedrückt wurde |
TIPP:
Der Druckknopf wurde ans Ende der Standard-Druckknöpfe gehängt. Falls Sie ihn lieber am Anfang haben möchten, so müssen Sie den Knopf in der Methode BUILD_TOOLBAR nur zu Beginn der Tabelle einfügen (INSERT … INDEX 1)
Anpassungen
In dem Programm müssen Sie noch das Dynpro 100 anlegen und die Ablauflogik einsetzen (siehe unten). Den GUI-Status müssen Sie nicht definieren; wir nehmen den Standard-Status für Listen.
Coding
*&---------------------------------------------------------------------* *& Report ZZ_Toolbar *&---------------------------------------------------------------------* REPORT zz_toolbar. *** Event-Handler-Class schon hier bekannt machen CLASS lcl_alv_eventhandler DEFINITION DEFERRED. *** Event-Handler DATA evt_handler TYPE REF TO lcl_alv_eventhandler. *** ALV-Grid DATA gr_alv TYPE REF TO cl_gui_alv_grid. *** CustomContainer des Grid DATA gr_cc TYPE REF TO cl_gui_custom_container. *** Beispieltabelle "Länderbezeichnungen" DATA gt_t005t TYPE STANDARD TABLE OF t005t. *----------------------------------------------------------------------* * CLASS lcl_alv_eventhandler DEFINITION *----------------------------------------------------------------------* CLASS lcl_alv_eventhandler DEFINITION. PUBLIC SECTION. *** Globales Feld um zu wissen, welchen Zustand der Knopf gerade hat DATA gv_pressed TYPE char1. METHODS: *** User-Command auswerten handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm sender, *** Toolbar beeinflussen handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive sender, *** Eigenen Knopf an Toolbar anbauen build_toolbar IMPORTING i_object TYPE REF TO cl_alv_event_toolbar_set. ENDCLASS. "lcl_alv_eventhandler DEFINITION *----------------------------------------------------------------------* * CLASS lcl_alv_eventhandler IMPLEMENTATION *----------------------------------------------------------------------* CLASS lcl_alv_eventhandler IMPLEMENTATION. METHOD handle_user_command. *** HandleUserCommand *** *>>> Hierdurch wird die Methode "HANDLE_TOOLBAR" erneut durchlaufen CALL METHOD gr_alv->set_toolbar_interactive. ENDMETHOD. "handle_user_command METHOD handle_toolbar. *** HandleToolbar *** CALL METHOD build_toolbar EXPORTING i_object = e_object. ENDMETHOD. "handle_toolbar METHOD build_toolbar. *** Toolbar erweitern DATA: ls_toolbar TYPE stb_button. *** Trenner CLEAR ls_toolbar. MOVE 3 TO ls_toolbar-butn_type. APPEND ls_toolbar TO i_object->mt_toolbar. *** Icon "Test" CLEAR ls_toolbar. MOVE 'TEST ' TO ls_toolbar-function. MOVE 'Test' TO ls_toolbar-quickinfo. MOVE 'Testknopf' TO ls_toolbar-text. IF gv_pressed = space. *** Knopf war nicht gedrückt gv_pressed = 'X'. MOVE icon_led_green TO ls_toolbar-icon. MOVE space TO ls_toolbar-checked. ELSE. *** Knopf war gedrückt gv_pressed = space. MOVE icon_led_red TO ls_toolbar-icon. MOVE 'X' TO ls_toolbar-checked. ENDIF. APPEND ls_toolbar TO i_object->mt_toolbar. ENDMETHOD. "build_toolbar ENDCLASS. "lcl_alv_eventhandler IMPLEMENTATION START-OF-SELECTION. CALL SCREEN 100. *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* MODULE status_0100 OUTPUT. SET PF-STATUS 'STLI' OF PROGRAM 'SAPMSSY0'. PERFORM init_alv. ENDMODULE. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* MODULE user_command_0100 INPUT. CASE sy-ucomm. WHEN 'BACK' OR '%EX' OR 'RW'. SET SCREEN 0. LEAVE SCREEN. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* *& Form init_alv *&---------------------------------------------------------------------* FORM init_alv. DATA ls_layout TYPE lvc_s_layo. *** Nur einmal die Routine durchlaufen CHECK NOT gr_alv IS BOUND. *** CustomContainer instanziieren CREATE OBJECT gr_cc EXPORTING container_name = 'ALV'. *** ALV starten CREATE OBJECT gr_alv EXPORTING i_parent = gr_cc i_appl_events = 'X'. *** Ereignisbehandler CREATE OBJECT evt_handler. SET HANDLER evt_handler->handle_toolbar FOR gr_alv. SET HANDLER evt_handler->handle_user_command FOR gr_alv. *** Beispieldaten lesen SELECT * FROM t005t INTO TABLE gt_t005t UP TO 20 ROWS. *** ALV-Grid ausgeben CALL METHOD gr_alv->set_table_for_first_display EXPORTING i_structure_name = 'T005T' is_layout = ls_layout CHANGING it_outtab = gt_t005t EXCEPTIONS OTHERS = 4. ENDFORM. "init_alv
Ablauflogik Dynpro 100
PROCESS BEFORE OUTPUT. MODULE status_0100. * PROCESS AFTER INPUT. MODULE user_command_0100.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024